

use std::{error::Error, fs::{self, File}, io::Write, os::unix::process};

// use cairo::{Context, Format, ImageSurface};
use lopdf::{Document};
use tesseract::{ Tesseract};

use crate::scan_image::preprocess_scan_image; // 297mm对应的点

// pub fn extract_pdf_text() -> anyhow::Result<()> {
//     // 扫描版 PDF 文件路径
//     let pdf_path = format!("file://{}", "/Users/zhaoqiang/Downloads/shhr_hyzx.pdf");
//     // 使用 poppler 加载 PDF 文档
//     let doc = Document::from_file(&pdf_path, None)?;
//     let page_count = doc.n_pages();
//     let output_dir = "poppler_extracted_images";
//     // 创建目录存储提取的图像
//     fs::create_dir_all(output_dir)?;
//     println!("PDF 包含 {} 页内容", page_count);
//     // 遍历每一页
//     for page_num in 0..page_count {
//         println!("\n----- 处理第 {} 页 -----", page_num + 1);
//         // 获取页面
//         let page = doc
//             .page(page_num)
//             .ok_or_else(|| anyhow::anyhow!("无法获取第 {} 页", page_num + 1))?;
//         // 获取页面尺寸（以点为单位，1点 = 1/72英寸）
//         let (width, height) = page.size();
//         // 设置 DPI 为 300，计算像素尺寸
//         let dpi = 300.0;
//         let scale = dpi / 36.0;
//         let pixel_width = (width * scale) as i32;
//         let pixel_height = (height * scale) as i32;
//         // 创建 Cairo 图像表面用于渲染
//         let mut surface = ImageSurface::create(Format::Rgb24, pixel_width, pixel_height)
//             .or_else(|e| Err(anyhow::anyhow!("创建图像表面失败: {}", e)))?;
//         {
//             let context = Context::new(&surface)?;
//             // 缩放上下文以匹配 DPI
//             context.scale(scale, scale);
//             // 渲染页面到表面
//             page.render(&context);
//         }
//         // 获取图像尺寸信息（先获取这些不需要可变借用的值）
//         let stride = surface.stride() as usize;
//         let width = surface.width() as u32;
//         let height = surface.height() as u32;
//         // 将表面内容转换为图像
//         let data = surface
//             .data()?;
//         // 创建 ImageBuffer 对象
//         let mut img_buffer = ImageBuffer::new(width, height);
//         for y in 0..height {
//             for x in 0..width {
//                 let pos = (y as usize) * stride + (x as usize) * 3;
//                 let pixel = Rgba([
//                     data[pos],     // R
//                     data[pos + 1], // G
//                     data[pos + 2], // B
//                     255,           // A (不透明)
//                 ]);
//                 img_buffer.put_pixel(x, y, pixel);
//             }
//         }
//         // 转换为 PNG 格式的内存数据
//         // let mut png_data = Vec::new();
//         // The image is already saved above, so we can remove this part
//         let img_path = format!("{}/page_{}.png", output_dir, page_num + 1);
//         img_buffer.save(&img_path)
//             .map_err(|e| anyhow::anyhow!("保存PNG失败: {}", e))?;
//         // img_buffer.write_to(&mut std::io::Cursor::new(&mut png_data), image::ImageFormat::Png)?;
//         // 初始化 Tesseract（支持中文+英文）
//         let tesseract = Tesseract::new(None, Some("chi_sim+eng"))?;
//         // 对图像进行 OCR 识别
//         let text = tesseract
//             .set_image(&img_path)?
//             .recognize()?
//             .get_text()?;
//         println!("第 {} 页识别结果:\n{}", page_num + 1, text);
//     }

//     Ok(())
// }

pub fn extract_pdf_text() -> anyhow::Result<()> {
    // 扫描版 PDF 文件路径
    let pdf_path = "/Users/zhaoqiang/Downloads/员工行为管理系统材料打包/家访材料和家访照片样本.pdf";
    let output_dir = "extracted_images";
    // 创建目录存储提取的图像
    fs::create_dir_all(output_dir)?;
    // 使用 poppler 加载 PDF 文档
    let doc = Document::load(&pdf_path)?;
    let pages = doc.get_pages();
    println!("扫描版PDF包含 {} 页内容\n", pages.len());

    // 初始化Tesseract OCR
    // let mut tesseract = Tesseract::new(None, Some("chi_sim+eng"))?; // 使用中文和英文识别，可根据需要更改语言

    // 遍历每一页
    for (page_num, (_, obj_id)) in pages.iter().enumerate() {
        // 提取页面中的图像
        let imgs = doc.get_page_images(*obj_id)?;
        for (j, pdf_img) in imgs.into_iter().enumerate() {
            println!("图像 {} 的过滤器信息：{:?}", j, pdf_img.filters);
            let img = image::load_from_memory(&pdf_img.content)?;
            let img = img.rotate270();
            let img = preprocess_scan_image(img).or_else(|e| Err(anyhow::anyhow!("图像预处理失败: {}", e)))?;
            let img_path = format!("extracted_images/page_{}_{}.png", page_num + 1, j);
            img.save(&img_path)?;

            println!("已保存图像：{}（大小：{}字节）", img_path, pdf_img.content.len());
            let tesseract = Tesseract::new(None, Some("chi_sim"))?;
            // 对图像进行 OCR 识别
            let text = tesseract
                .set_image(&img_path)?
                .recognize()?
                .get_text()?;
            println!("第 {} 页识别结果:\n{}", page_num + 1, text);
        }
    }
    Ok(())
}


